1. 题目描述(中等难度)

[success] 剑指 Offer 33. 二叉搜索树的后序遍历序列

2. 解法一:递归分治

划分左右子树: 遍历后序遍历的 [i,j] 区间元素,寻找 第一个大于根节点 的节点,索引记为 m 。此时,可划分出左子树区间 [i,m−1] 、右子树区间 [m, j - 1] 、根节点索引 j 。

class Solution {
    public boolean verifyPostorder(int[] postorder) {
      if(postorder.length < 2){
          return true;
      }
      return verify(postorder,0,postorder.length-1);
    }

    //递归实现
    public boolean verify(int[] postorder,int left,int right){
       //当前区域不合法的时候直接返回true 
       if(left >=right){
           return true;
       }
       //当前树的根节点的值
      int root = postorder[right];
      int m = left;
      //当前区域第一个大于根节点的,说明后续区域的值都是右子树的节点
      for(int i=left;i<right;i++){
          if(postorder[i] <= root){
              m++;
          }
      }
      //校验右子树,左子树已经都小于跟节点了,所以不需要校验
      for(int i=m;i<right;i++){
        if(postorder[i] < root){
            return false;
        }
      }
      //检查左子树
      if(!verify(postorder,left,m-1)){
         return false;
      }
      //检查右子树
      if(!verify(postorder,m,right-1)){
         return false;
      }
      return true;  
    }
}

3. 解法二:单调栈

© gaohueric all right reserved,powered by Gitbook文件修订时间: 2021-12-08 23:22:22

results matching ""

    No results matching ""